// 源码网址：https://raw.gitcode.com/Xuan_er123/proxy.pac/raw/main/proxy_test.pac

// 初始化全局缓存
var globalDomesticRules = null;
var lastLoadTime = 0;

// 修正1: 使用正确的 raw 文件 URL
var RULES_URL = "https://raw.gitcode.com/Xuan_er123/proxy.pac/raw/main/direct_domian_boole.json";

function FindProxyForURL(url, host) {
    // ================== 一、特殊域名直接处理 ==================
    // 1. 本地地址直连
    if (isPlainHostName(host) || 
        host === "127.0.0.1" || 
        host === "localhost" ||
        shExpMatch(host, "*.local")) {
        return "DIRECT";
    }
    
    // ================== 二、IP地址规则匹配 ==================
    var ip = dnsResolve(host);
    if (ip) {
        // 1. IPv4匹配
        if (ip.indexOf('.') !== -1) {
            // 修正2: 精简IP列表，只保留关键IP段
            var ipv4Domestic = [
                "10.0.0.0/8",
                "172.16.0.0/12",
                "192.168.0.0/16",
                "127.0.0.0/8"
            ];
            
            for (var i = 0; i < ipv4Domestic.length; i++) {
                var net = ipv4Domestic[i].split('/');
                if (isInNet(ip, net[0], genMask(net[1]))) {
                    return "DIRECT";
                }
            }
        }
        // 2. IPv6匹配（精简）
        else if (ip.indexOf(':') !== -1) {
            var ipv6Domestic = [
                "fc00::/7",     // 唯一本地地址
                "fe80::/10",    // 链路本地地址
                "::1/128"       // 本地回环
            ];
            
            for (var j = 0; j < ipv6Domestic.length; j++) {
                var cidr = ipv6Domestic[j];
                if (isInNet6(ip, cidr)) {
                    return "DIRECT";
                }
            }
        }
    }

    // ================== 三、域名规则匹配 ==================
    // 1. 强制代理域名
    var forcedProxyDomains = {
        "youtube.com": true,
        "youtu.be": true,
        "google.com": true,
        "twitter.com": true,
        "facebook.com": true,
        "instagram.com": true
    };
    
    if (isInForcedProxy(host, forcedProxyDomains)) {
        return "PROXY 192.168.3.15:10081; SOCKS 192.168.3.15:10080";
    }
    
    // 2. 直连域名（从远程URL加载）
    var domesticRules = loadDomesticRules(RULES_URL);
    
    // 修正3: 添加详细的调试日志
    if (domesticRules) {
        console.log("已加载规则数量: " + Object.keys(domesticRules).length);
    } else {
        console.log("使用缓存规则或默认直连列表");
        // 默认直连列表（备选）
        domesticRules = {
            ".cn": true,
            ".com.cn": true,
            ".baidu.com": true,
            ".qq.com": true,
            ".taobao.com": true,
            ".jd.com": true
        };
    }
    
    if (isDomesticDomain(host, domesticRules)) {
        console.log("直连域名: " + host);
        return "DIRECT";
    }
    
    // 4. 其它域名默认使用代理
    console.log("代理域名: " + host);
    return "PROXY 192.168.3.15:10081; SOCKS 192.168.3.15:10080";
    
    // ================== 四、工具函数 ==================
    // 强制代理域名检查
    function isInForcedProxy(host, domains) {
        var parts = host.split('.');
        for (var i = 0; i < parts.length; i++) {
            var domain = parts.slice(i).join('.');
            if (domains[domain]) {
                console.log("强制代理域名: " + host);
                return true;
            }
        }
        return false;
    }
    
    // 国内域名检查
    function isDomesticDomain(host, rules) {
        // 直接匹配完整域名
        if (rules[host]) return true;
        
        // 匹配子域名
        var parts = host.split('.');
        for (var i = 0; i < parts.length; i++) {
            var domain = '.' + parts.slice(i).join('.');
            if (rules[domain]) return true;
        }
        return false;
    }
    
    // 加载国内域名规则（带缓存和重试）
    function loadDomesticRules(url) {
        try {
            // 使用缓存（1小时内有效）
            var now = new Date().getTime();
            if (globalDomesticRules && (now - lastLoadTime < 3600000)) {
                return globalDomesticRules;
            }
            
            // 修正4: 使用同步XHR加载
            var xhr = new XMLHttpRequest();
            xhr.open('GET', url, false); // 同步请求
            
            // 修正5: 添加超时和错误处理
            xhr.timeout = 3000; // 3秒超时
            xhr.ontimeout = function() {
                console.log("规则加载超时");
            };
            
            xhr.send();
            
            if (xhr.status === 200) {
                // 修正6: 更健壮的JSON解析
                var data = {};
                try {
                    data = JSON.parse(xhr.responseText);
                } catch(e) {
                    console.log("JSON解析错误: " + e.message);
                    return globalDomesticRules;
                }
                
                // 兼容不同结构
                globalDomesticRules = data.domestic || data;
                lastLoadTime = now;
                return globalDomesticRules;
            } else {
                console.log("规则加载失败，状态码: " + xhr.status);
            }
        } catch(e) {
            console.log('规则加载异常: ' + e.message);
        }
        
        // 失败时返回上次成功加载的规则
        return globalDomesticRules;
    }

    // 生成IPv4掩码
    function genMask(prefix) {
        prefix = parseInt(prefix, 10);
        var mask = 0xFFFFFFFF << (32 - prefix);
        return [(mask >>> 24) & 0xFF, (mask >>> 16) & 0xFF, (mask >>> 8) & 0xFF, mask & 0xFF].join('.');
    }
    
    // IPv6 CIDR匹配（精简版）
    function isInNet6(ip, cidr) {
        try {
            var [net, prefix] = cidr.split('/');
            prefix = parseInt(prefix || "128", 10);
            
            // 简单比较（完整版在大型列表上性能较差）
            return ip.startsWith(net);
        } catch(e) {
            return false;
        }
    }
}

// ==== 兼容性处理 ====
if (typeof console === "undefined") {
    this.console = { 
        log: function() {},
        error: function() {} 
    };
}

// 初始化
console.log("PAC 文件已加载");